﻿
using Conmmon;
using RabbitMQ.Client;
using RabbitMQ.Client.Events;
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace Consunmer_two
{
    class Program
    {
        static void Main(string[] args)
        {
            //点对点 一对多
           // Consumer_One_To_Many();

            //发布订阅模式
            Consumer_Issue_Take();
        }

        /// <summary>
        /// 发布订阅模式
        /// </summary>
        public static void Consumer_Issue_Take()
        {
            var dis = new Dictionary<string, object>();
            dis.Add("x-dead-letter-exchange", "Test.dead");
            dis.Add("x-dead-letter-routing-key", "test.dead");
            var message = RabbitMQHelper.Consunmer("lianyu", "", "", dis);

            message.OnCallback = (str) =>
            {
                Console.WriteLine($"消费者2接收消息：{str.Content}");
                return true;
            };
            Console.ReadLine();
        }


        /// <summary>
        /// 发布订阅模式
        /// </summary>
        //public static void Consumer_Issue_Take()
        //{
        //    var message = RabbitMQHelper.Consunmer("lianyu", "amq.fanout", "");

        //    message.OnCallback = (str) =>
        //    {
        //        Console.WriteLine($"消费者2接收消息：{str.Content}");
        //    };
        //    Console.ReadLine();

        //    return;

        //    // 获取TCP 长连接
        //    var connection = RabbitMQHelper.GetConnection();

        //    // 创建通信通道， 相当于TCP中虚拟链接
        //    var channel = connection.CreateModel();

        //    /**
        //     * 创建队列，声明并创建一个队列，如果队列已存在，这使用这个队列
        //     * 第一个参数：队列ID
        //     * 第二个参数：是否持久化，false对应不持久化数据,MQ停止之后数据就会丢失
        //     * 第三个参数：是否队列私有化，false则代表所有的消费者都可以访问，true代表只有第一次拥有它的消费者才能一直使用
        //     * 第四个参数: 是否自动删除，false代表链接停掉之后不自动删除这个队列
        //     * 其他额外参数为null
        //     * **/
        //    channel.QueueDeclare("lianyu1", true, false, false, null);

        //    channel.QueueBind("lianyu1", "amq.fanout", "");

        //    channel.BasicQos(0, 1, false);
        //    //创建事件
        //    EventingBasicConsumer comsumers = new EventingBasicConsumer(channel);

        //    //触发事件
        //    Task.Run(() =>
        //    {
        //        comsumers.Received += (model, ea) =>
        //        {
        //            var body = ea.Body.ToArray();
        //            var message = Encoding.UTF8.GetString(body);
        //            Thread.Sleep(500);
        //            //false知识确认签收当前的消息，设置为true的时候则代表签收该消费者所有未签收的消息
        //            channel.BasicAck(ea.DeliveryTag, false);
        //            Console.WriteLine("发布订阅！！！");
        //            Console.WriteLine($"消费者2接收消息：{message}");
        //        };

        //        /**
        //        * 从MQ服务器中获取数据
        //        * 创建一个消息消费者
        //        * 第一个参数：队列名
        //        * 第二个参数：是否自动确认收到消息，false代表手动确认消息，这个是MQ推荐的做法
        //        * 第三个参数：要传入IBasicConsumer接口
        //        *
        //        **/
        //        channel.BasicConsume("lianyu1", false, comsumers);
        //    });

        //    Console.ReadLine();
        //}



        /// <summary>
        /// 一对多链接方式
        /// </summary>
        public static void Consumer_One_To_Many()
        {

            // 获取TCP 长连接
            var connection = RabbitMQHelper.GetConnection();

            // 创建通信通道， 相当于TCP中虚拟链接
            var channel = connection.CreateModel();


            /***
             * 
             * 创建队列，声明并创建一个队列，如果队列已存在，这使用这个队列
             * 第一个参数：队列ID
             * 第二个参数：是否持久化，false对应不持久化数据,MQ停止之后数据就会丢失
             * 第三个参数：是否队列私有化，false则代表所有的消费者都可以访问，true代表只有第一次拥有它的消费者才能一直使用
             * 第四个参数: 是否自动删除，false代表链接停掉之后不自动删除这个队列
             * 其他额外参数为null
             * 
             * **/

            channel.QueueDeclare("HelloWorld", true, false, false, null);

            //创建事件
            EventingBasicConsumer comsumers = new EventingBasicConsumer(channel);

            //触发事件
            Task.Run(() =>
            {
                comsumers.Received += (model, ea) =>
                {
                    var body = ea.Body.ToArray();
                    var message = Encoding.UTF8.GetString(body);

                    //false知识确认签收当前的消息，设置为true的时候则代表签收该消费者所有未签收的消息
                    channel.BasicAck(ea.DeliveryTag, false);
                    Console.WriteLine($"消费者2接收消息：{message}");
                };

                /***
                * 从MQ服务器中获取数据
                * 创建一个消息消费者
                * 第一个参数：队列名
                * 第二个参数：是否自动确认收到消息，false代表手动确认消息，这个是MQ推荐的做法
                * 第三个参数：要传入IBasicConsumer接口
                *
                * **/
                channel.BasicConsume("HelloWorld", false, comsumers);
            });

            Console.ReadLine();

        }


    }

}
